#ifndef _PLAYER_H_
#define _PLAYER_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <iostream>
#include <fstream>
#include <string>

#include <json/json.h>
#include "mj.h"
#include "hole_mjs.h"
#include "form_mjs.h"
#include "out_mjs.h"
#include "do_sql.h"
#include "mj_type.h"
#include "game_logic.h"

class Client;
	
typedef enum
{
	ADD = 0,
	SUB,	
} update_action;

typedef enum
{
	NOT_READY = 0,          	//游戏中未准备
	READY = 1,  				//准备
	INPlAY = 2, 				//游戏中
	INPLAY_AFTER_GETIN_MJ = 3,  //刚摸完牌，还没操作(可报听，自摸胡，暗杠，明杠)
	INPLAY_AFTER_PUTOUT_MJ = 4, //刚打出一张牌，还没操作(其他玩家可碰，放杠，放炮胡)
	INPLAY_AFTER_PENG_MJ = 5,   //刚碰了一张牌，还没操作(可亮倒，暗杠)
	
}STATUS;


class Player : public AsyncTimer
{		
public:
	int					_vip_level;	//VIP等级
	int					_roomid; //房间ID
	int					_seatid; //座位ID
    int                 _uid;    //玩家UID
	std::string         _login_ip;     //玩家IP
	std::string			_nick_name;    //玩家昵称
	std::string			_avater_url;   //玩家头像URL
	int                 _sex;          //玩家性别
	int                 _online;       //玩家是否在线 1在线，0离线

	int                 _score;      //游戏得分
	int                 _diamonds; //钻石
	int                 _gold;     //金币
	int                 _paiwei_score; //排位积分
	int                 _robot_flag;	
	int                 _logout_type;//退出类型
	
	HoleMjs             _hole_mjs;//手上的麻将牌
	FormMjs             _form_mjs;//成型的麻将牌
	OutMjs              _out_mjs; //弃牌区麻将牌	
	STATUS              _status;   //玩家状态标志 0未准备 1准备 2游戏中没轮到操作 3游戏中轮到操作未操作 4游戏中轮到操作已经操作(已经打出牌了)
	Mj                  _mo_mj;

	int                 _cur_gang_score;         //本局杠分，初始值是0
	int                 _cur_angang_score;       //暗杠score
	int                 _cur_minggang_score;     //明杠score
	int                 _cur_fanggang_score;     //放杠score
	
	int                 _cur_pao_flag;           //本局放炮还是自摸，0初始值, 1点炮玩家，2接炮玩家，3自摸玩家，4包胡玩家
	int                 _cur_end_flag;           //0平，1输，2赢，3屁胡

	int                 _tian_hu_flag; //天胡标志
	int                 _di_hu_flag;//地胡标志
	int                 _mo_cnt;
	int                 _guo_shou_bu_hu_flag;

	//结束统计
	int 				_zimo_times;  //自摸次数
	int 				_jiepao_times; //接炮次数
	int 				_dianpao_times; //点炮次数
	int 				_anggang_times; //暗杠次数
	int 				_minggang_times; //明杠次数

	int                 _agree_dissroom; //是否同意解散房间， 0,未确认 1 发起者 2 同意 3 不同意

	int                 _card_type;  //结算牌型
	int                 _jiaopai_flag; //是否叫牌
	
	int                 _fangpaiji_num; //翻牌鸡 算分基数
	int                 _gudingji_num_hole; //手上的固定鸡 算分基数
	int                 _gudingji_num_out; //打出去的固定鸡 算分基数
	int                 _chongfengji_num; //冲锋鸡 算分基数

	int                 _gudingji_score;  //固定鸡得分
	int                 _fangpaiji_score; //番牌鸡得分
	int                 _chongfengji_score; //冲锋鸡得分
	int                 _zherenji_score; //责任鸡得分
	
	int                 _cardtype_score; //当前牌型输赢分数
	
	int                 _winlose_score; //本局总的输赢分数
	int                 _dq_val;        //定缺门，1,3,5 分别表示 万条筒
	int                 _have_gang;     //是否有杠? 无杠，不能放炮平胡
	int                 _cur_baoting_flag; //是否报听 0未报听，1天听，2地听	
	std::vector<int>    _vec_score;
	int                 _robot_op;
	//快抢赛累计统计
	int					_quick_hu_count;		//胡牌次数

	GameTimer			_ready_timer;			//准备倒计时
	GameTimer			_pass_timer;			//Pass倒计时
	GameTimer			_auto_outmj_timer;		//听牌和机器人带打计时器
	GameTimer           _qiangganghu_timer;		//抢杠胡定时器
	GameTimer           _getin_outmj_timer;		//出牌倒计时
	
private:

public:
    Player();
    virtual ~Player();
	int init(int uid);
	void reset();
	int get_info();
	bool do_out_mj(Mj mj);

	int last_mj_val();

	//计算翻牌鸡数量 手上+牌组+地上的牌个数加起来返回 鸡牌是幺鸡加倍
	int calculate_fangpaiji_base_num(Mj fangpai_mj); //计算翻牌鸡记分基数
	int calculate_gudingji_base_num_hole(); //sb计算手上固定鸡记分基数
	int calculate_gudingji_base_num_out(); //计算打出去固定鸡算分基数

	
	int calculate_chongfengji_base(); //计算冲锋鸡计分基数
};

#endif
